import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class UdpClient2 {

    private static final SocketAddress ADDRESS = new InetSocketAddress("localhost", 8888);
    // 创建这个对象存放 服务器的IP，端口号等信息
    public static void main(String[] args) throws IOException {

        //4. 创建客户端的DatagramSocket，开启随机端口号就行， 可以发送及接收UDP数据报
        DatagramSocket socket = new DatagramSocket();

        // 开始准备要发送的数据 。     getBytes 将字符串对象转为字节数组的形式
        //byte[] bytes = "发点别的内容看看会怎么样".getBytes();
        // 这里换成从键盘获取内容作为发送的内容
        Scanner scanner = new Scanner(System.in);

        while(true){
            System.out.println("————————————————————————————————————————————————————————");
            System.out.println("请输入要展示的目录: ");
            //  约定好了 以 '\3' 作为结束分隔符
            String request = scanner.nextLine() + "\3";
            //
            byte[] requestData = request.getBytes(StandardCharsets.UTF_8);
            // 组装要发送的UDP数据报，包含数据及发送端的信息
            DatagramPacket requestPacket = new DatagramPacket(requestData, requestData.length,ADDRESS);
            // 6. 发送UDP 数据报
            socket.send(requestPacket);

            // 接下来就是 升级的部分
            // 8.接收 服务端响应的数据报，并根据 内容决定 下个步骤
            // 8-1  创建数据报， 用于接收服务端 返回的响应
            byte[] responseData = new byte[1024];
            DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length);
            // 8-2 接收响应数据报
            socket.receive(responsePacket);
            System.out.println("该目录下的文件列表为: ");
            int next = 0;
            // 我认为 这一段解析的逻辑有些冗余了
            for (int i = 0; i < responseData.length ;i++){
                byte b = responseData[i];
                if(b == '\3')  // 结束符退出
                    break;
                if(b == '\n'){  // 遇到换行符时进行解析
                    //  起始位置到换行符前一个索引位置为要解析的内容
                    String fileName = new String(responseData, next, i-next);
                    System.out.println(fileName);
                    // 下次解析从换行符的后一个索引开始
                    next = i+1;
                }
            }
        }
//
//        // 5.2组装要发送的 UDP数据报， 包含数据，以及发送的服务端信息
//        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, ADDRESS);
//
//        // 6. 发送UDP数据报
//        socket.send(packet);
    }

}
